package main

import (
	"fmt"
	"strconv"
)

// 求n的阶乘。至少使用递归函数完成一次。
func factorial(n int) int {
	if n <= 1 {
		return 1
	}

	return factorial(n-1) * n
}

// 编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐
func equilateralTriangle(n int) {
	// 打印上三角
	for i := 1; i <= n; i++ {
		for j := n; j > 0; j-- {
			// 计算需要格式化的长度，都是数字，len即可
			formatLen := len(strconv.Itoa(j)) + 1
			if j <= i {
				fmt.Printf("%*d", formatLen, j)
			} else {
				fmt.Printf("%*s", formatLen, " ")
			}
		}
		fmt.Println()
	}
}

// 简述defer作用和应用
func deferFunc() {
	fmt.Println("start")
	defer fmt.Println(1)
	defer func() {
		fmt.Println(2)
	}()
	fmt.Println("end")

	// 总结：
	// defer的作用是延迟执行，它会在方法return后，或panic后执行
	// defer的执行顺序是LIFO原则，后进先出
	// defer后面只能跟一个函数或方法的调用
	// defer通常用于资源释放，文件句柄、网络连接等打开后，通常使用defer进行关闭，保障资源的释放
}

func main() {
	// 阶乘
	fmt.Println(factorial(6))
	// 正三角打印
	equilateralTriangle(12)
	// 简述defer作用和应用
	deferFunc()
}
